#ifndef TESTCASEEDITOR_H
#define TESTCASEEDITOR_H

#include <QWidget>
#include <QList>
#include "datamodel.h"
#include "testcasemanager.h"
#include <QTableWidget>

// 统一使用数据模型命名空间的类型，无重复定义
using TestDataModel::ConfigItem;
using TestDataModel::TestDataItem;
using TestDataModel::TestGroup;
using TestDataModel::TestCase;

namespace Ui {
// 两个UI类分别对应两个业务类（Qt Designer 需创建两个.ui文件：testcaseeditor.ui 和 testcasedetaeditor.ui）
class TestCaseEditor;
class TestCaseDetailEditor;
}

// -------------------------- 详情编辑类：TestCaseDetailEditor --------------------------
// 职责：单个测试案例的详情编辑（多组数据管理、输入/预期数据配置、保存/取消）
class TestCaseDetailEditor : public QWidget {
    Q_OBJECT

public:
    // 构造函数：
    // - manager：测试案例管理器（用于获取配置数据）
    // - testCase：待编辑的案例（新增时为nullptr，编辑时传入已有案例指针）
    // - parent：父窗口
    explicit TestCaseDetailEditor(TestCaseManager* manager,
                                  const TestCase* testCase = nullptr,
                                  QWidget *parent = nullptr);
    ~TestCaseDetailEditor();

signals:
    void saved(TestCase testCase);  // 保存信号：传递编辑后的案例
    void canceled();                // 取消信号：通知父窗口关闭编辑界面

private slots:
    // 编辑相关槽函数（仅处理自身UI逻辑）
    void on_addToInputBtn_clicked();    // 勾选配置项添加到输入数据
    void on_addToExpectedBtn_clicked(); // 勾选配置项添加到预期数据
    void on_removeInputBtn_clicked();   // 删除选中的输入数据
    void on_removeExpectedBtn_clicked();// 删除选中的预期数据
    void on_searchBtn_clicked();        // 搜索过滤配置项
    void on_saveBtn_clicked();          // 保存编辑结果
    void on_cancelBtn_clicked();        // 取消编辑
    void on_addGroupBtn_clicked();      // 新增测试组
    void on_deleteGroupBtn_clicked();   // 删除当前测试组
    void on_prevGroupBtn_clicked();     // 切换到上一组
    void on_nextGroupBtn_clicked();     // 切换到下一组

private:
    Ui::TestCaseDetailEditor *ui;
    TestCaseManager* m_manager;         // 测试案例管理器（仅用于获取配置数据）
    const TestCase* m_originalTestCase; // 原始待编辑案例（仅读取，不直接修改）
    QList<ConfigItem> m_allConfigData;  // 左侧配置项缓存（避免重复从管理器获取）
    TestCase m_currentEditingCase;      // 当前编辑的案例（中间状态，保存时提交）
    int m_currentGroupIndex = 0;        // 当前选中的组索引（UI状态，不存入数据模型）

    // 编辑界面辅助方法
    void setupEditUI();                 // 初始化编辑界面的表格和控件
    void populateConfigDataList();      // 填充左侧配置项列表
    void filterConfigData(const QString& keyword); // 按关键字过滤配置项
    QList<ConfigItem> getCheckedConfigItems(); // 获取左侧勾选的配置项
    void addInputDataToTable(const TestDataItem& item); // 输入数据添加到表格
    void addExpectedDataToTable(const TestDataItem& item); // 预期数据添加到表格
    void refreshGroupData();            // 刷新当前组的输入/预期表格数据
    void updateGroupLabel();            // 更新组标签（例：当前组：1/3）
    void loadConfigData(const QList<ConfigItem>& configData); // 加载配置项到左侧表格
    void loadOriginalTestCase(const TestCase* testCase); // 加载原始案例到编辑界面
    /**
     * @brief 将界面上（表格中）的数据同步回 m_currentEditingCase 模型中。
     * 这个函数是解决保存问题的核心。
     */
    void syncUiToModel();
};

// -------------------------- 列表管理类：TestCaseEditor --------------------------
// 职责：测试案例列表管理（显示所有案例、批量删除、新增/编辑入口、返回主列表）
class TestCaseEditor : public QWidget {
    Q_OBJECT

public:
    explicit TestCaseEditor(TestCaseManager* manager, QWidget *parent = nullptr);
    ~TestCaseEditor();

signals:
    void backToTestList();  // 返回主列表信号（供主窗口处理）

private slots:
    // 列表相关槽函数（仅处理列表逻辑，不涉及编辑细节）
    void on_addBtn_clicked();    // 新增案例：打开编辑界面
    void on_deleteBtn_clicked(); // 删除选中的案例
    void on_editBtn_clicked();   // 编辑案例：打开编辑界面（选中单个案例）
    void on_backBtn_clicked();   // 返回主列表

    // 接收编辑界面的信号
    void onEditorSaved(TestCase testCase); // 编辑完成：更新案例列表并保存
    void onEditorCanceled();               // 编辑取消：关闭编辑界面，返回列表

private:
    Ui::TestCaseEditor *ui;
    TestCaseManager* m_manager;         // 测试案例管理器（核心依赖，用于数据读写）
    QList<TestCase> m_testCases;        // 缓存所有测试案例（减少管理器访问次数）
    TestCaseDetailEditor* m_detailEditor = nullptr; // 详情编辑界面实例（避免重复创建）

    // 列表辅助方法
    void initTestCaseList();            // 初始化列表表格（列名、样式等）
    void refreshTestCaseList();         // 刷新列表数据（从缓存加载到表格）
};

#endif // TESTCASEEDITOR_H
